package cn.zhj.base.util

import cn.zhj.mvpart.mvp.IView
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOn

object RequestUtils {

    suspend fun <T> normalRequest(
        scope: CoroutineScope = GlobalScope,
        request: suspend CoroutineScope.() -> T,
        resp:(T?)->Unit,
        error:(String)->Unit /*= {toast(it)}*/   //toat(“网络异常”)
    ) {
        scope.launch {
            flow { emit(request())}      //网络请求
                .flowOn(Dispatchers.IO) //指定请求线程
                .catch {e->
                    error(e.message!!)
                }              // 异常处理
                .collect { resp(it)} //数据返回
        }
    }

    fun <T> normalRequestLoading(
        view: IView?,
        scope: CoroutineScope = GlobalScope,
        request: suspend CoroutineScope.() -> T,
        resp:(T?)->Unit,
        error:(String)->Unit /*= {toast(it)}*/   //toat(“网络异常”)
    ) {
        scope.launch() {
            //运行在scope指定的线程，这里是主线程。所以除了切换过线程的地方，该方法体内都是运行在上下文 指定的线程
            withContext(Dispatchers.Main){
                delay(2000)
                view?.showLoading()
            }
            flow {
                //flow方法体，及emit发射的方法体均运行在下面的flowOn指定的线程内
                emit(request())
            }      //网络请求
                .flowOn(Dispatchers.IO) //指定请求线程
                .catch {e->
                    //catch运行在上下文 指定的线程
                    withContext(Dispatchers.Main){
                        view?.hideLoading()
                    }
                    error(e.message!!)
                }              // 异常处理
                .collect {
                    //collect运行在上下文 指定的线程
                    resp(it)
                    withContext(Dispatchers.Main){
                        view?.hideLoading()
                    }
                } //数据返回
        }
    }

}